package com.qfmy.web.app.exception;

import com.qfmy.common.exception.BaseException;
import com.qfmy.common.result.Result;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @author 清风明月
 * @Package com.qfmy.common.exception
 * @date 2025/9/9
 * @description 全局异常处理器
 */
@SuppressWarnings("all")
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 全局异常处理器：处理所有未被特定异常处理器捕获的通用异常（兜底处理）
     * 注解@ExceptionHandler(Exception.class)表示该方法专门处理Exception类型及其子类的异常
     * @param e 捕获到的异常实例（可能是系统异常、未处理的业务异常等所有Exception子类）
     * @return 统一封装的失败响应Result对象，用于前端接收标准化的错误信息
     */
    @ExceptionHandler(Exception.class)
    public Result handle(Exception e) {
        // 打印异常堆栈信息，便于开发/运维人员排查问题（生产环境可根据日志级别调整）
        e.printStackTrace();
        // 返回默认的失败响应（通常包含通用错误码和信息，如"系统异常，请稍后重试"）
        return Result.fail();
    }


    /**
     * 自定义异常处理器：专门处理BaseException类型的异常（业务相关的自定义异常）
     * 注解@ExceptionHandler(BaseException.class)表示该方法仅处理BaseException及其子类的异常
     * @param e 捕获到的自定义异常实例（包含业务错误码和具体错误信息）
     * @return 统一封装的失败响应Result对象，携带具体的业务错误码和信息
     */
    @ExceptionHandler(BaseException.class)
    public Result handle(@NotNull BaseException e) {
        // 从自定义异常中获取错误描述信息
        String message = e.getMessage();
        // 从自定义异常中获取业务错误码（需确保BaseException类有getCode()方法）
        Integer code = e.getCode();
        // 打印异常堆栈信息，便于追踪业务异常发生的上下文
        e.printStackTrace();
        // 返回携带具体错误码和信息的失败响应，前端可根据code做差异化处理
        return Result.fail(code, message);
    }


}
